package digitrencer;


/**
 * A jelgenerátort megvalósító osztály. Egy előre definiált jelsorozatot ismétel ciklikusan.
 * @author Balázs
 */
public class Generator extends Input {
	private String sequence;
	private int position;

    /**
     * Konstruktor, meghívja az Input osztály konstruktorát, majd ellenőrzi,
     * hogy hány kimeneti illetve bemeneti vezetéket kapott.
     * Amennyiben több, mint nulla bemeneti, illetve több mint egy kimeneti
     * vezetéket kapott, hibát dob, mivel a Generatornak
     * legfeljebb egy kimenete lehet, bemenete pedig nincsen.
     * @param inputs    Bemeneti vezetékek
     * @param outputs   Kimeneti vezetékek
     * @throws IllegalArgumentException Amennyiben nem csak egy kimeneti vezeték van.
     */
    Generator(Wire[] inputs, Wire[] outputs) throws IllegalArgumentException{ //by Gergő
        super(inputs,outputs);
        if (outputs.length > 1){
            throw new IllegalArgumentException("Egy generátorra csak egy kimeneti vezeték köthető.");
        }
        sequence = "01";                  //default szekvencia
        position = 0;                     //default pozíció
        value[0] = (sequence.charAt(0) == '1');
    }

    /**
     * Lekérdezi a jelgenerátor szekvenciáját.
     * @return A jelgenerátor szekvenciája.
     */
    public String getSeq() {
            return sequence;    // a String valójában nem referenciatípusként működik, ki lehet adni
    }

    /**
     * Beállítja a jelgenerátor szekvenciáját.
     * @param seq A beállítandó szekvencia.
     * @throws IllegalArgumentException Amennyiben a szekvencia nem érvényes.
     */
    public void setSeq(String seq) throws IllegalArgumentException{
        // Ellenőrizzük, hogy helyes-e
        if (seq.length() == 0)
            throw new IllegalArgumentException("A generátor hibás szekvenciát kapott: \"" + seq + "\"");
        for (int i = 0; i < seq.length(); i++) {
            if (seq.charAt(i) != '0' && seq.charAt(i) != '1')
                throw new IllegalArgumentException("A generátor hibás szekvenciát kapott: \"" + seq + "\"");
        }

        sequence = seq;
        position = 0;
        value[0] = (sequence.charAt(position) == '1');
    }

    /**
     * Eggyel lépteti a jelgenerátort. Ha a jelgenerátor a sorozat végére ért,
     * akkor elölről kezdi.
     */
    public void step() {
        position++;                                                                 //pozíció növelése
        if (sequence.length()==position) position = 0;                                //Ha elértünk a szekvencia végére, előlről kezdjük.
        value[0] = (sequence.charAt(position) == '1');
    }

    /**
     * A jelgenerátort visszaállítja a sorozat elejére.
     */
    public void reset() {
        position = 0;
        value[0] = (sequence.charAt(position) == '1');
    }
}
